package com.sunshine.homepage.service.impl;

import com.sunshine.homepage.controller.ShoppingCartController;
import com.sunshine.homepage.dao.ProductsDao;
import com.sunshine.homepage.dao.ShoppingCartsDao;
import com.sunshine.homepage.entity.Products;
import com.sunshine.homepage.entity.ShoppingCarts;
import com.sunshine.homepage.service.ShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import sunshine.commcon.util.entity.Result;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Service
public class ShoppingCartServiceImpl implements ShoppingCartService {
    
    @Resource
    private ShoppingCartsDao shoppingCartsDao;
    
    @Resource
    private ProductsDao productsDao;
    
    @Override
    public Result<Boolean> addProductToCart(Long userId, Long productId, Integer quantity) {
        try {
            // 检查购物车中是否已存在该商品
            List<ShoppingCarts> existingItems = shoppingCartsDao.queryByUserIdAndProductId(userId, productId);
            
            if (!existingItems.isEmpty()) {
                // 如果商品已存在，更新数量
                ShoppingCarts existingItem = existingItems.get(0);
                existingItem.setQuantity(existingItem.getQuantity() + quantity);
                existingItem.setAddedTime(new Date());
                
                int updateResult = shoppingCartsDao.update(existingItem);
                if (updateResult > 0) {
                    log.info("购物车商品数量已更新: 用户ID={}, 商品ID={}, 新数量={}", userId, productId, existingItem.getQuantity());
                    return Result.ok(true);
                } else {
                    log.warn("更新购物车商品数量失败: 用户ID={}, 商品ID={}", userId, productId);
                    return Result.fail("更新购物车失败");
                }
            } else {
                // 如果商品不存在，添加新记录
                ShoppingCarts cartItem = new ShoppingCarts();
                cartItem.setUserId(userId);
                cartItem.setProductId(productId);
                cartItem.setQuantity(quantity);
                cartItem.setAddedTime(new Date());
                
                // 插入到数据库
                int result = shoppingCartsDao.insert(cartItem);
                
                if (result > 0) {
                    log.info("商品已成功添加到购物车: 用户ID={}, 商品ID={}, 数量={}", userId, productId, quantity);
                    return Result.ok(true);
                } else {
                    log.warn("添加购物车失败: 用户ID={}, 商品ID={}, 数量={}", userId, productId, quantity);
                    return Result.fail("添加购物车失败");
                }
            }
        } catch (Exception e) {
            log.error("添加购物车时发生异常: 用户ID={}, 商品ID={}, 数量={}", userId, productId, quantity, e);
            return Result.fail("系统异常，添加购物车失败");
        }
    }
    
    @Override
    public Result<List<ShoppingCartController.ShoppingCartVO>> getCartItems(Long userId) {
        try {
            // 直接根据用户ID查询购物车项
            List<ShoppingCarts> cartItems = shoppingCartsDao.queryByUserId(userId);
            
            // 转换为VO对象
            List<ShoppingCartController.ShoppingCartVO> result = new ArrayList<>();
            for (ShoppingCarts cartItem : cartItems) {
                ShoppingCartController.ShoppingCartVO vo = new ShoppingCartController.ShoppingCartVO();
                vo.setCartId(cartItem.getCartId());
                vo.setProductId(cartItem.getProductId());
                vo.setQuantity(cartItem.getQuantity());
                
                // 查询商品信息
                Products product = productsDao.queryById(cartItem.getProductId());
                vo.setProduct(product);
                
                result.add(vo);
            }
            
            log.info("成功获取用户购物车商品列表: 用户ID={}, 商品数量={}", userId, result.size());
            return Result.ok(result);
        } catch (Exception e) {
            log.error("获取购物车商品列表时发生异常: 用户ID={}", userId, e);
            return Result.fail("系统异常，获取购物车商品列表失败");
        }
    }
    
    @Override
    public Result<Boolean> updateCartItem(Long userId, Long cartId, Integer quantity) {
        try {
            // 查询购物车项
            ShoppingCarts cartItem = shoppingCartsDao.queryById(cartId);
            
            // 检查购物车项是否存在且属于当前用户
            if (cartItem == null) {
                log.warn("购物车项不存在: 购物车项ID={}", cartId);
                return Result.fail("购物车项不存在");
            }
            
            if (!cartItem.getUserId().equals(userId)) {
                log.warn("用户无权限操作该购物车项: 用户ID={}, 购物车项ID={}", userId, cartId);
                return Result.fail("无权限操作该购物车项");
            }
            
            // 更新数量
            cartItem.setQuantity(quantity);
            cartItem.setAddedTime(new Date());
            
            int updateResult = shoppingCartsDao.update(cartItem);
            if (updateResult > 0) {
                log.info("购物车商品数量已更新: 用户ID={}, 购物车项ID={}, 数量={}", userId, cartId, quantity);
                return Result.ok(true);
            } else {
                log.warn("更新购物车商品数量失败: 用户ID={}, 购物车项ID={}", userId, cartId);
                return Result.fail("更新购物车失败");
            }
        } catch (Exception e) {
            log.error("更新购物车商品数量时发生异常: 用户ID={}, 购物车项ID={}, 数量={}", userId, cartId, quantity, e);
            return Result.fail("系统异常，更新购物车失败");
        }
    }
    
    @Override
    public Result<Boolean> deleteCartItem(Long userId, Long cartId) {
        try {
            // 查询购物车项
            ShoppingCarts cartItem = shoppingCartsDao.queryById(cartId);
            
            // 检查购物车项是否存在且属于当前用户
            if (cartItem == null) {
                log.warn("购物车项不存在: 购物车项ID={}", cartId);
                return Result.fail("购物车项不存在");
            }
            
            if (!cartItem.getUserId().equals(userId)) {
                log.warn("用户无权限操作该购物车项: 用户ID={}, 购物车项ID={}", userId, cartId);
                return Result.fail("无权限操作该购物车项");
            }
            
            // 删除购物车项
            int deleteResult = shoppingCartsDao.deleteById(cartId);
            if (deleteResult > 0) {
                log.info("购物车商品已删除: 用户ID={}, 购物车项ID={}", userId, cartId);
                return Result.ok(true);
            } else {
                log.warn("删除购物车商品失败: 用户ID={}, 购物车项ID={}", userId, cartId);
                return Result.fail("删除购物车失败");
            }
        } catch (Exception e) {
            log.error("删除购物车商品时发生异常: 用户ID={}, 购物车项ID={}", userId, cartId, e);
            return Result.fail("系统异常，删除购物车失败");
        }
    }
}
